//通过反射操作类
//2023/04/25

import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        Class<?> stu = null;
        try {
            stu = Class.forName("entity.Student");
            //通过构造方法实例化对象
            Object instance = stu.newInstance();

            //通过对象调用方法
            Method setNeme = stu.getMethod("setNeme", String.class);
            setNeme.invoke(instance, "小明");//修改方法内容

            //获取类名  需要实例化后操作
            Class className = stu.getClass();
            System.out.println("类名："+className);

            //获取所有属性 返回field数组
            Field[] arr= stu.getDeclaredFields();
            System.out.println("属性数组："+Arrays.toString(arr));


            //通过反射获取类中的方法,并获取返回值类型
            Method[] meth= stu.getMethods();
            Arrays.stream(meth)
                    .filter(M->(M+"").indexOf(".setNeme")!=-1)
                    .forEach(M-> System.out.println(M));

        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        }
    }
    public static Object execute(String className,String methodName,Object args[]){
       //实现：通过类的名字、方法名字，方法参数调用方法，返回值为该方法的返回值。
        try {
            Class<?> stu=Class.forName(className);

            //获取所有方法名字
            Method[] me=stu.getMethods();//



            Object instanc= stu.newInstance();



        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }

        return null;
    }


}